查看原文
其他

用Rust编写EWasm合约

Antonio 开源社KAIYUANSHE 2022-04-06



| 作者:Antonio

| 编辑:钱奕

| 设计:马丽娜

| 责编:王玥敏


大家好我是Second State 工程师 Antonio ,很高兴能参与CosCon年会,然后在线上跟大家分享用Rust编写ewasm合约。


关于ewasm合约


那首先要谈ewasm合约是什么呢,还有我们如何使用 。


那ewasm 其实是ethereum web assembly 这样子的简写,而ethereum是一个去中心化open source的区块链,它的特色是有智能合约(smart contract)的运算功能,也因此我们有时会称blockchain为web 3 ,是下一个时代的web 。


Web assembly 是一个技术,是一个开放的标准,它定义了一个二进制的格式,可以在跨平台的浏览器中执行。



什么是Ewasm

 

Ewasm其实是是一个web assembly的subset(子集),仔细来看一下用ewasm写的合约其实是格式都是符合web assembly而会有一些ethereum 特有的function,像ethereum finish,因此可以理解Ewasm是一个符合web assembly 规范的程序,但是它运行的runtime要能提供ethereum专有function,而成为web assembly的子集。



使用ewasm的目的


在web 2.0中 ,一般的web server 会有API,然后我们可以用任何的语言,比如说像Rust或者是go,或者是c# .Net,或者是java、python、ruby,任何语言都可以跟server进行沟通,而沟通时使用的是HTTP protocol。


Blockchain 也是类似的方式,只不过是链上EVM跟外界沟通,但EVM相对之下,沟通的方式反而没有像传统web 2.0 API这么弹性方便的,语言也很受限。


Ewasm其实是提供了一个格式,可以传进链上执行,所以任何语言,只要能编译成ewasm这格式,就可以在链上面执行。



Blockchain 的适配性


  • 为什么Blockchain 跟Rust 相合


首先先帮大家理解一下什么是Rust 。Rust 是一种多种典范,然后是高阶、通用(各种用途都可以使用)的编程语言。


Rust的设计注重效率、安全,还有特别是能安全的并发,然后这几个特征就就刚好是区块链特别需要的。


因为区块链要做事情非常多,所以重视效率,而且跟财务、金融有关系,所以安全也首选需要考虑的,基于这样的特性Rust在Blockchain的发展就很好。


  • 为什么跟Web assembly也很合

Rust可以精确控制lifetime,也提供很好的效能,加上不需要GC,不会有额外的开销。在执行格式上是比较小的二进制的档案,因为web assembly着眼于比较小的二进制档案跟效率啊,而也跟Rust很合。


传统上web server有很多API来跟外界沟通,而沟通是用HTTP。


HTTP是hypertext markup language的简称,其实是一种text ,是一种文字的格式,透过网际网络然后来沟通。


而blockchain被称为web 3 其实是通过binary 的格式,然后在blockchain网络上跟链上节点沟通,差别就是一个是文字形式,一个是二进制的形式来沟通,所以他们本质上是一样的。


Blockchain具有比较先进的功能,比较好的加密,比较好的安全性。在从代码层面来理解,当我们用web来理解blockchain的时候,就会发现他们有很很多很相像的特征。


比如说像都有个进入点,像rocky的代码中,这有个#[launch] ,就是进入点。如果用rust的sewup来写blockchain的应用 ,它也会有一个进入点,就是#[ewasm_main]。透过主程序,然后再决定要交给哪一个handler,所以不管是web 2.0、web 3.0都会做路由。


在Web 2.0时,路由是用URI(unifrom resource identifier) 来做路由,也就是我们常见由斜线组成的字串。而在blockchain上面的路由是二进制的格式的,四个bytes ,这个叫functional signature。


它是一般是经过一个hash function 去算这个原本function 的名称跟它传进来的参数而得到的。在这框架内,大部分情况是不需要填入的会自动计算,但也可以填入强迫指定。Blockchain中,链上节点会读前面这些四个bytes,对应到哪个handler,进行路由。


因此整体上来看,Blockchain跟传统的web 都是一样的概念。



现阶段技术水平


那我们来看一下先前技术,用rust 来写这个合约的技术水平在什么样状况?


在2019年11月,就有ewasm-rust-api,也已经有出0.11的版本,也可以写一个rust的程序,再编译编出wasm。然后送到有的执行wasm的blockchain就可以运行了。


但我们就会发现这个合约是很不Rust风格的,比方如说function都没有return,更不用提result跟option,然后很多操作都过于底层,感觉就不是很有点落差,可以说确实可以拿Rust来写blockchain合约,但很难实用。



现阶段困难及解决方法


  • 哪些地方让困难


因为这些ABI都不是Rust的 ,都没有Result、Option,这种基本的约定,很多操作都还是对Bytes32进行操作。


同时在开发Web的时候,其实不会太去关心说存在web server 上面的档案所使用的格式。


故而在blockchain上,如果要同时考虑储存的bytes,还是要以32 bytes为单位的储存的话,会有点太低阶。


而且今天这个些Rust的API,其实没有做一些辅助的功能,也因此难去做路由,此外也缺少原始的rust开发者最习惯的用cargo test 来进行测试


所以整体而言,面对了这么多的困难,所以用ewasm-rust-api来写一个智能合约其实是不大合宜的。


  • 解决问题--Sewup


Sewup把很多blockchain的细节都封装起来,让开发传统Web的开发者能更好进入Blockchain的领域开发。


用Sewup来写合约,除了语法上的问题得到了解决,在这个框架中,会自动把constructor跟contract runtime都编译成wasm,再组合起来,同时还包含了上链的工具,在开发的体验上,尽可能做到与传统web开发一致。



我是Antonio,很高兴能有这个机会,在网络上跟大家分享,也期待大家的使用。




相关阅读 | Related Reading


从用户到Committer,参与Apache ShenYu开源社区并不遥远


中国唯一女性Apache Member来临直播间,畅聊开源45分钟!直播预约中~


自主申报倒计时|2021年,中国开源先锋33人,快来推荐你心尖上的开源领袖吧!



开源社简介

开源社成立于 2014 年,是由志愿贡献于开源事业的个人成员,依 “贡献、共识、共治” 原则所组成,始终维持厂商中立、公益、非营利的特点,是最早以 “开源治理、国际接轨、社区发展、开源项目” 为使命的开源社区联合体。开源社积极与支持开源的社区、企业以及政府相关单位紧密合作,以 “立足中国、贡献全球” 为愿景,旨在共创健康可持续发展的开源生态,推动中国开源社区成为全球开源体系的积极参与及贡献者。


2017 年,开源社转型为完全由个人成员组成,参照 ASF 等国际顶级开源基金会的治理模式运作。近七年来,链接了数万名开源人,集聚了上千名社区成员及志愿者、海内外数百位讲师,合作了近百家赞助、媒体、社区伙伴。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存